package main

import "fmt"

// 闭包
/*
	全局变量特点：
		1. 常驻内存
		2. 污染全局

	局部变量特点：
		1. 不常驻内存
		2. 不污染全局

	闭包:
		可以让一个变量常驻内容且不污染全局
		定义在一个函数内部的函数
		闭包是将函数内部和函数外部连接起来的桥梁，函数和其引用环境的组合体
		由于闭包作用域返回的局部变量资源不会被立刻销毁回收，所以可能会占用更多的内存
		建议在非常有必要的时候才使用闭包
*/

func adder1() func(int) int { // 相当于创建了一个全局可调用的变量i，常驻内存但不污染全局
	var i = 10
	return func(y int) int {
		i += y
		return i
	}
}

func main() {
	var fn = adder1()
	fmt.Println(fn(10))
	fmt.Println(fn(10))
	var fn2 = adder1()
	fmt.Println(fn2(10))
	fmt.Println(fn2(10))
}
